No estoy seguro de cómo expresar mi pregunta con palabras, así que déjame intentar explicarla con un ejemplo: Digamos que mi programa se encuentra con un comportamiento extraño en una acción específica. Ya encontré un código que es la causa de este comportamiento extraño. Al deshabilitar esta secuencia, no me encuentro con este comportamiento. Desafortunadamente, necesito este código porque algo más no funciona en ese momento. Entonces, lo que voy a hacer a continuación es averiguar por qué algo va diferente cuando ese extracto de código está activo. Para comprender mejor lo que está sucediendo, a veces quiero ejecutar toda la acción, incluido el 'código incorrecto' y, a veces, sin él. Luego puedo comparar el resultado, por ejemplo, lo que sucede en la interfaz de usuario o lo que devuelve mi función. El primer enfoque que me viene a la mente es ejecutar mi programa con el código habilitado, hacer lo que quiera, luego detener mi programa, comentar el código, recompilar y ejecutar nuevamente. Um ... eso suena tonto. Especialmente si luego necesito volver a activar ese código para ver en otra ocasión el otro comportamiento, y luego volver a apagarlo, encenderlo, apagarlo y así sucesivamente. No es una opción para mí usar puntos de interrupción e influir en el orden de las declaraciones o modificar valores para ejecutar o no las declaraciones if, bucles for, etc. Dos ejemplos: Depurado un comportamiento crítico de sincronización y cuando detengo el programa, la sincronización cambia significativamente. Por lo tanto, el primer punto de interrupción que puedo establecer debe estar al final de la acción. 1 Espero que aparezca una información sobre herramientas u otra ventana que se 'suprime' cuando se le da el foco a VS. Por lo tanto, no puedo usar ningún punto de interrupción. Ni al principio ni al final de la acción. ¿Existe alguna técnica en Visual Studio 2012 que me permita marcar este código como opcional y puedo decidir si quiero o no ejecutar esta secuencia de código antes de ejecutar la acción? Pienso en algo como si (verdadero | falso) en un nivel superior. No estoy buscando una solución en la que necesite volver a ejecutar mi programa varias veces. En ese caso, todavía podría hacer el enfoque simple de simplemente comentar el código con # si es falso. 1 Tenga en cuenta que, por supuesto, puedo establecer un punto de interrupción cuando necesito mirar una variable específica en una posición determinada (si no he escrito el valor en la salida) pero desactivaré los puntos de interrupción nuevamente para ejecutar toda la acción en una Vamos.
2020-12-07 23:11:11
En el depurador de Visual Studio, puede establecer un punto de interrupción justo delante de su "código en cuestión". Cuando el código se detiene en ese punto, puede optar por dejar que continúe o puede hacer clic con el botón derecho en cualquier otra línea y seleccionar Establecer siguiente declaración. Es una opción un tanto extraña, pero he llegado a apreciarla. | La única opción que se me ocurre es agregar algo a su interfaz de usuario que solo aparece al depurar, lo que le brinda la opción de incluir / excluir las operaciones en cuestión. Mientras lo hace, es posible que desee habilitar el restablecimiento de la aplicación a un "estado conocido" desde la interfaz de usuario también. | Pienso en algo como si (verdadero | falso) en un nivel superior. ¿Por qué "en un nivel superior"? ¿Por qué no usar exactamente esto? Desea que un fragmento de código se ejecute a veces, a veces no, y el modificador debe cambiarse en tiempo de ejecución, no en tiempo de compilación; esto obviamente conduce a si (condición) { // código en juego } El problema aquí es qué tipo de condición usará, tal vez una variable que establezca como verdadera en la versión de lanzamiento de su código y, a veces, en falsa en su versión de depuración. Tal vez el valor se tome de un archivo de configuración, tal vez de una variable de entorno, tal vez calculado por algún tipo de lógica en su programa, lo que sea y cuando quiera. EDITAR: también puede introducir una variable booleana en su código para la condición, inicializarla a verdadera por defecto y cambiar su valor usando el depurador cuando lo desee. | Las directivas de preprocesador pueden ser lo que busca. Son fragmentos de código para que los ejecute el compilador, identificables comenzando con un carácter # (y estilísticamente, de forma predeterminada, no siguen el patrón de sangría de su código, sino que siempre residen firmemente en el borde izquierdo del editor ): #define INCLUDE_DODGY_CODE public void MyMethodWithDodgyBits () { #if INCLUDE_DODGY_CODE myDodgyMethod (); #terminara si myOkMethod (); } En este caso, si se incluyó #define INCLUDE_DODGY_CODE, la llamada myDodgyMethod () se compilará en su programa. De lo contrario, el compilador omitirá la llamada y simplemente no existirá en su binario. | Hay un par de opciones para depurar según lo solicite. Visual Studio tiene varias opciones para navegar directamente a través del código. Puede utilizar la función Establecer declaración siguiente para pasar directamente a una declaración en particular. También puede editar valores directamente a través de la ventana Inmediato, QuickWatch y la información sobre herramientas que se desplaza sobre las variables durante la depuración. Visual Studio también tiene la capacidad de reproducir el historial de ejecución. Eche un vistazo a IntelliTrace para comenzar. Puede ser útil cuando tiene varias áreas de preocupación que interactúan y generan la condición de error. También puede envolver sus secciones de código dentro de bloques condicionales y establecer las variables condicionales según corresponda. Eso podría ser mientras está depurando, o podría pasar parámetros a través de un archivo de configuración. El uso de verificaciones condicionales puede ser más fácil que recorrer el código manualmente si hay una serie de declaraciones que desea excluir. | A veces depende de la versión de VS y del idioma, pero puede editar el código con gusto (para comentarlo o envolverlo en un #ifdef 0 grande), luego presione alt + F10 y el compilador recompilará, volverá a vincular y continuará la ejecución como si nunca lo hubieras jugado. Pero si bien eso funciona maravillosamente en VC ++ (desde VS v6 IIRC), C # puede tener problemas: encuentro (con VS2010) que no puedo editar y continuar de esta manera con funciones que contienen declaraciones lambda (principalmente linq) y código de 64 bits nunca solía hacer esto también. Aún así, vale la pena experimentar con él, ya que a veces es realmente útil. | He trabajado en aplicaciones que tienen un código opcional que se usa solo para depurar y que no deberían aparecer en el entorno de producción. Este segmento de código opcional fue más fácil de controlar para nosotros usando un archivo de configuración, ya que no requirió una recompilación para cambiarlo. Tal solución podría no ser el final del resultado final, pero podría ayudar a superarlo hasta que se encuentre una solución. Si tiene varias secciones opcionales que deben probarse en combinación, este estilo de corrección podría requerir varias claves en el archivo de configuración, lo que podría ser una desventaja y una molestia para realizar un seguimiento. | Su pregunta no es exactamente clara, por lo que posiblemente hay tantas respuestas que cree que no son válidas. Es posible que desee considerar la posibilidad de volver a redactarlo si nadie parece capaz de responder a la pregunta. Con el riesgo de dar otra respuesta no válida, agregaré alguna información sobre cómo he tratado el problema en el pasado. La forma más sencilla es colocar cualquier código opcional dentro #if DEBUG // Código opcional aquí #terminara si De esa manera, cuando se ejecuta en modo de depuración, el código se implementa y cuando se ejecuta en modo de lanzamiento, no. Cambiar entre los dos requiere hacer clic en un botón. También resolví el mismo problema de manera similar con una bandera simple: bool runOptionalCode = falso; entonces si (runOptionalCode) { // Coloque el código opcional aquí } De nuevo,cambiar entre modos requiere cambiar una palabra, por lo que es una tarea sencilla. Mencionas esto en tu pregunta, pero lo descartas por razones que no están claras. Como dije, se requiere muy poco esfuerzo para cambiar entre los dos. Si necesita realizar cambios entre el código mientras se está ejecutando, la mejor manera es usar un elemento de la interfaz de usuario o una pulsación de tecla que modifique la bandera mencionada en el ejemplo anterior. Sin embargo, dependiendo de su aplicación, esto podría suponer más esfuerzo de lo que vale la pena. En el pasado, descubrí que cuando tengo un oyente clave ya implementado como parte del proyecto, tener un par de pulsaciones de teclas para decidir si ejecutar mi código de depuración (opcional) funciona mejor. En una aplicación sin oyentes clave, prefiero seguir con uno de los métodos anteriores. | Tu respuesta StackExchange.ifUsing ("editor", function () { StackExchange.using ("editor externo", función () { StackExchange.using ("fragmentos", función () { StackExchange.snippets.init (); }); }); }, "fragmentos de código"); StackExchange.ready (function () { var channelOptions = { etiquetas: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("editor externo", función () { // Debe activar el editor después de los fragmentos, si los fragmentos están habilitados if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("fragmentos", función () { createEditor (); }); } else { createEditor (); } }); function createEditor () { StackExchange.prepareEditor ({ useStacksEditor: false, heartbeatType: 'respuesta', autoActivateHeartbeat: falso, convertImagesToLinks: verdadero, noModals: cierto, showLowRepImageUploadWarning: true, reputacionToPostImages: 10, bindNavPrevention: verdadero, sufijo: "", imageUploader: { brandingHtml: "Desarrollado por \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.725645.40531 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.492 14.648.942348 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5454.5C35.8 3520.49455C35.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.662025C 289.15527 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.92.125.283 28.121 12.8346C2834.232.283 28.121 12.8346C2834.1256.28 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6317.10.99 732.943C 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.802802.86.9512C358. 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 4,62866 780793 4,8993 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.593V 9.91179 9.53458 6.91179C10.593V3 8.9411811 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.8571675 13.896213.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003cpath d = \" M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 1.00342.89693 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Contribuciones de usuario con licencia bajo \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (política de contenido) \ u003c / a \ u003e", allowUrls: verdadero }, onDemand: verdadero, discardSelector: ".discard-answer" , inmediatamenteShowMarkdownHelp: true, enableSnippets: true }); } }); ¡Gracias por contribuir con una respuesta a Stack Overflow! Asegúrese de responder la pregunta. ¡Proporcione detalles y comparta su investigación! Pero evita ... Pedir ayuda, aclaraciones o responder a otras respuestas. Hacer declaraciones basadas en opiniones; respóndelos con referencias o experiencia personal. Para obtener más información, consulte nuestros consejos sobre cómo escribir buenas respuestas. Borrador guardado Borrador descartado Regístrate o inicia sesión StackExchange.ready (function () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Regístrese con Google Registrarse usando Facebook Regístrese con correo electrónico y contraseña Enviar Publicar como invitado Nombre Email Requerido, pero nunca mostrado StackExchange.ready ( function () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-mark-some-code-as-optional-while-debugging-in visual-studio-2012% 23new-answer ',' question_page '); } ); Publicar como invitado Nombre Email Requerido, pero nunca mostrado Publica tu respuesta Descarte Al hacer clic en "Publicar su respuesta", acepta nuestros términos de servicio, política de privacidad y política de cookies. No es la respuesta que estás buscando? Examine otras preguntas etiquetadas debugging visual-studio o formule su propia pregunta.